내원 이력 6종 — 125종 → 131종
OCM_FollowUp(bzDataInterface.vb:1028 — 지금 이후 취소 아닌 내원. 원문의 ROWNUM 은 ORDER BY 보다 먼저 걸려 임의 행이었다 — 인라인뷰 정렬로 "가장 가까운 미래 내원"에 고정), OCM_외출외박신청일/종료일 (:1883/:1936 — 오늘 포함 CowSlpOut='Y' 구간의 시작/끝. 0행이면 서버 현재시각이 나오는 레거시 폴백을 SQL NVL 로 그대로 옮겼다 — ㉛에서 12자 폴백 확인), OCM_최초내원일(:1988 Case Else — 이 쿼리는 원문부터 인라인뷰 정렬이 있어 결정적. KIMEYE 분기 미이식), OCM_초진일_발병일(:2040)·OCM_신환_초진일(:2138 — 진료과 앞 2자를 레거시는 GetCodInfDT 임의 행에서 뽑았지만 우리는 문맥의 진료 행에서). "지금/오늘"은 전부 서버 시각(SYSDATE) — 레거시 SystemDateTime 과 같은 의미이고 단말 시계에 좌우되지 않는다. - dotnet test 338/338 · --edit-smoke 실패 0 (이름 검사 131종) - --db-patient ①~㉝ 전건 통과 — ㉝ 신설: 재진 있는 차트로 실값 검증 - --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
4642439ffd
commit
ec47c98bdd
@@ -111,6 +111,76 @@ public sealed class PatientExtraStore
|
||||
+ " WHERE ComNum = :m ORDER BY DtlTblCod) WHERE ROWNUM = 1",
|
||||
("m", comNum));
|
||||
|
||||
/// <summary>
|
||||
/// 퇴원 이후 다음 외래 방문(OCM_FollowUp, :1028) — 지금보다 뒤의 취소 아닌 내원 중
|
||||
/// 가장 가까운 것의 접수일시 12자리. 원문의 ROWNUM 은 ORDER BY 보다 먼저 걸려
|
||||
/// 임의 행이었다 — 인라인뷰로 정렬을 먼저 걸어 "가장 가까운 미래 내원"으로 고정한다.
|
||||
/// "지금"은 서버 시각이다(레거시 SystemDateTime 과 같은 의미).
|
||||
/// </summary>
|
||||
public string FollowUp(string chtNum)
|
||||
=> Scalar(
|
||||
"SELECT v FROM (SELECT ComAcpDtm v FROM P_ComInf"
|
||||
+ " WHERE ComChtNum = RPAD(:c, 10)"
|
||||
+ " AND ComAcpDtm > TO_CHAR(SYSDATE, 'YYYYMMDDHH24MI')"
|
||||
+ " AND ComAcpStt <> 'OC' ORDER BY ComAcpDtm) WHERE ROWNUM = 1",
|
||||
("c", chtNum));
|
||||
|
||||
/// <summary>
|
||||
/// 외출·외박 구간의 한쪽 끝(OCM_외출외박신청일/종료일, :1883/:1936) — 오늘을 포함하는
|
||||
/// 외박 허용(CowSlpOut='Y') 병실 행의 CowStrDtm/CowEndDtm.
|
||||
/// <b>0행이면 서버 현재시각을 돌려준다</b> — 특이하지만 레거시가 그렇다
|
||||
/// (기록이 없으면 "지금"이 종이에 찍힌다). P_RblInf 곱으로 다중행이면 원문은
|
||||
/// 임의 행이었다 — 시작일시 최신 행으로 고정한다.
|
||||
/// </summary>
|
||||
public string LeaveOfAbsence(decimal comNum, bool endSide)
|
||||
{
|
||||
var column = endSide ? "CowEndDtm" : "CowStrDtm";
|
||||
// "오늘"은 서버 날짜다(레거시 SystemDate 와 같은 의미) — 바인드 대신 SYSDATE 로 쓴다
|
||||
return Scalar(
|
||||
"SELECT NVL(MAX(v), TO_CHAR(SYSDATE, 'YYYYMMDDHH24MI')) FROM ("
|
||||
+ $"SELECT v FROM (SELECT {column} v FROM P_CoiInf"
|
||||
+ " INNER JOIN P_ComInf ON ComNum = CoiComNum AND ComPatTyp = 'I' AND ComAcpStt <> 'IC'"
|
||||
+ " INNER JOIN P_CowInf ON CowComNum = CoiComNum"
|
||||
+ " AND TO_CHAR(SYSDATE, 'YYYYMMDD') || '2359' BETWEEN CowStrDtm AND CowEndDtm"
|
||||
+ " INNER JOIN P_RblInf ON RblComNum = CoiComNum AND CoiMtiSeq = RblMtiSeq"
|
||||
+ " AND RblStrDte BETWEEN CoiStrDte AND CoiEndDte"
|
||||
+ " WHERE CoiComNum = :m AND RblDtrCod = '-' AND RblNxtNum = 0 AND RblIncTyp = 'M'"
|
||||
+ " AND CowSlpOut = 'Y'"
|
||||
+ " AND TO_CHAR(SYSDATE, 'YYYYMMDD') BETWEEN CoiStrDte AND CoiEndDte"
|
||||
+ " ORDER BY CowStrDtm DESC) WHERE ROWNUM = 1)",
|
||||
("m", comNum));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 최초 내원일(OCM_최초내원일, :1988 Case Else) — 이 내원 이전의 취소 아닌 재진(ComNfsTyp='2')
|
||||
/// 중 가장 이른 접수일시. 원문이 인라인뷰 안에 ORDER BY 를 걸어 이 쿼리는 원래 결정적이다.
|
||||
/// P_CodInf 조인은 원문 그대로(진료 행이 있는 내원만) — 곱행이 생겨도 값이 같은 컬럼이라 무해.
|
||||
/// KIMEYE 분기(초재진 무구분, ComNfsTyp 우선 정렬)는 옮기지 않았다.
|
||||
/// </summary>
|
||||
public string FirstVisit(string chtNum, string acpDtm)
|
||||
=> Scalar(
|
||||
"SELECT v FROM (SELECT ComAcpDtm v FROM P_ComInf"
|
||||
+ " INNER JOIN P_CodInf ON ComNum = CodComNum"
|
||||
+ " WHERE ComChtNum = RPAD(:c, 10) AND ComAcpDtm <= :a"
|
||||
+ " AND ComAcpStt <> 'OC' AND ComNfsTyp = '2'"
|
||||
+ " ORDER BY ComAcpDtm) WHERE ROWNUM = 1",
|
||||
("c", chtNum), ("a", acpDtm));
|
||||
|
||||
/// <summary>
|
||||
/// 진료과별 초진일(OCM_초진일_발병일 :2040 · OCM_신환_초진일 :2138) — 최초 내원일에
|
||||
/// 진료과 앞 2자 조건이 붙는다. 신환 포함이면 ComNfsTyp IN ('1','2'), 아니면 '2' 만.
|
||||
/// </summary>
|
||||
public string FirstVisitByDepartment(string chtNum, string acpDtm, string depCod2, bool includeNew)
|
||||
=> Scalar(
|
||||
"SELECT v FROM (SELECT ComAcpDtm v FROM P_ComInf"
|
||||
+ " INNER JOIN P_CodInf ON ComNum = CodComNum"
|
||||
+ " WHERE ComChtNum = RPAD(:c, 10) AND ComAcpDtm <= :a"
|
||||
+ (includeNew ? " AND ComAcpStt <> 'OC' AND ComNfsTyp IN ('1','2')"
|
||||
: " AND ComAcpStt <> 'OC' AND ComNfsTyp = '2'")
|
||||
+ " AND SUBSTR(CodDepCod, 1, 2) = :p"
|
||||
+ " ORDER BY ComAcpDtm) WHERE ROWNUM = 1",
|
||||
("c", chtNum), ("a", acpDtm), ("p", depCod2));
|
||||
|
||||
/// <summary>스칼라 1칸 — 0행이거나 NULL 이면 빈 문자열. 잔여 공백은 걷는다(문맥 행과 같은 규칙)</summary>
|
||||
private string Scalar(string sql, params (string Name, object Value)[] binds)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user