수술 파생 6종 — 236종 → 242종, ㉘ 수술 검증이 SKIP 에서 실검증으로
OCM_수술주상병(bzDataInterface.vb:13148 + GetOprInfDT_OKDMain :13364 — 기존 수술 조회와의 실질 차이가 상병 집계의 주상병 한정(OPRVAR1='0') 한 줄이라 SurgeryStore 에 mainDiagnosisOnly 를 얹었다. 치환이 빗나가면 필터 없는 값이 조용히 나가므로 가드로 던진다), OCM_수술집도의_진료과/_그룹진료과(:3157/:3194 — 집도의(DTRUIDCOD)를 오늘 기준 마스터로 푸는 원문 특이점(OprStt 무필터·SYSDATE 유효기간) 그대로, 최신 수술 첫 행 고정), OCM_수술명칭(:3520 Case Else — OPRCOD 를 수술일 순으로, 각 행 뒤 공백 1칸 + CRLF 결합. GNBEDRO· HIMCHAN_BP 의 OPNAME 포함 분기 미이식). 사유 완결 2종: OCM_수술진단명(:3066 — PURME 전용, 그 외 병원은 Case 미매칭으로 항상 빈 값), OCM_수술처치(:3474 — SUSS·YJRCH 전용). ㉘ 정정: 수술 검증이 늘 SKIP 이던 원인은 소유자 탐색을 O_OprInf 로 한 것 — 실제 조회(GetOprInfDT)의 축은 S_OprInf(수술 신청)다. 표를 바로잡자 이 시험 DB 에서 수술 행 1건·OPNAME 실값이 검증됐다 (SurgeryStore 의 낡은 주석도 함께 정정). - dotnet test 342/342 · --edit-smoke 실패 0 (이름 검사 242종) - --db-patient ①~㊱ 전건 통과 — ㉘ 이 처음으로 실값 PASS - --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
02657b3893
commit
03fff0a3a4
@@ -704,6 +704,43 @@ public sealed class PatientExtraStore
|
||||
"SELECT UDF_GETAGE(PatBthDay, :a) FROM P_PatInf WHERE PatChtNum = RPAD(:c, 10)",
|
||||
("a", day8), ("c", chtNum));
|
||||
|
||||
/// <summary>
|
||||
/// 수술 집도의의 진료과/그룹진료과 이름(OCM_수술집도의_진료과 :3157 · _그룹진료과 :3194) —
|
||||
/// 수술 신청의 집도의(S_OprTyp OprTyp='DTRUIDCOD')를 오늘 기준 사용자·부서 마스터로 푼다.
|
||||
/// 원문 특이점 그대로: OprStt 필터가 없고(취소 수술 포함), 유효기간이 수술일이 아니라
|
||||
/// <b>오늘</b> 기준이다. 최신 수술(OprKey DESC) 첫 행으로 접는다(원문 Rows(0)).
|
||||
/// </summary>
|
||||
public string SurgeonDepartment(decimal comNum, bool groupName)
|
||||
=> Scalar(
|
||||
"SELECT v FROM (SELECT "
|
||||
+ (groupName ? "DtlCodNam" : "DepKorNam") + " v FROM S_OprInf"
|
||||
+ " INNER JOIN S_OprTyp ON OprKey = OprKeyNum AND OprComNum = :m AND OprTyp = 'DTRUIDCOD'"
|
||||
+ " INNER JOIN M_UidMst ON UidCod = OprCod"
|
||||
+ " AND TO_CHAR(SYSDATE, 'YYYYMMDD') BETWEEN UidStrDte AND UidEndDte"
|
||||
+ " INNER JOIN M_DepMst ON DepCod = UidDepCod"
|
||||
+ " AND TO_CHAR(SYSDATE, 'YYYYMMDD') BETWEEN DepStrDte AND DepEndDte"
|
||||
+ (groupName
|
||||
? " INNER JOIN M_DtlMst ON DepGrpCod = DtlCod AND DtlTblCod = 'GDPTBL'"
|
||||
+ " AND TO_CHAR(SYSDATE, 'YYYYMMDD') BETWEEN DtlStrDte AND DtlExpDte"
|
||||
: string.Empty)
|
||||
+ " ORDER BY OprKey DESC) WHERE ROWNUM = 1",
|
||||
("m", comNum));
|
||||
|
||||
/// <summary>
|
||||
/// 수술명 목록(OCM_수술명칭, :3520 Case Else) — 확정 수술의 수술코드명(OprTyp='OPRCOD')
|
||||
/// 을 수술일 순으로. GNBEDRO·HIMCHAN_BP 의 OPNAME 포함 분기는 미이식.
|
||||
/// 결합(첫 행 뒤 공백, 이후 CRLF)은 해석기가 원문대로 한다.
|
||||
/// </summary>
|
||||
public IReadOnlyList<string> SurgeryNames(decimal comNum)
|
||||
=> Rows(
|
||||
"SELECT OprCodNam FROM S_OprInf"
|
||||
+ " INNER JOIN S_OprTyp ON OprKeyNum = OprKey"
|
||||
+ " WHERE OprComNum = :m AND OprStt = 'E' AND OprTyp = 'OPRCOD'"
|
||||
+ " ORDER BY OprDte",
|
||||
("m", comNum))
|
||||
.Select(r => r.TryGetValue("OprCodNam", out var v) ? v : string.Empty)
|
||||
.ToArray();
|
||||
|
||||
/// <summary>스칼라 1칸 — 0행이거나 NULL 이면 빈 문자열. 잔여 공백은 걷는다(문맥 행과 같은 규칙)</summary>
|
||||
private string Scalar(string sql, params (string Name, object Value)[] binds)
|
||||
{
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace SheetMe.Data.Stores;
|
||||
/// 상병과 달리 <b>병원 분기가 없다</b>(Select Case 0회). 바인드는 내원번호 하나뿐이고
|
||||
/// 접수일자 조건은 원문에서 이미 주석 처리되어 있다(:sAcpDte — 죽은 코드).
|
||||
///
|
||||
/// SQL 은 원문에서 기계 추출했다(133줄 그대로). O_OprInf 를 축으로 수술명·부위·상병·
|
||||
/// SQL 은 원문에서 기계 추출했다(133줄 그대로). S_OprInf(수술 신청)를 축으로 수술명·부위·상병·
|
||||
/// 집도의·마취의를 LISTAGG 로 접는 큰 조회이고, 소비 태그 8종이 전부
|
||||
/// <b>첫 행에서 컬럼 하나</b>를 집는다 — 그래서 행 목록만 돌려주고 선택은 해석기가 한다.
|
||||
///
|
||||
@@ -165,12 +165,31 @@ ORDER BY OprComNum, OprDte DESC, OprDayNum ASC
|
||||
#region Methods
|
||||
/// <summary>이 내원의 수술 행들 — 없으면 빈 목록</summary>
|
||||
public List<Dictionary<string, string>> Surgeries(decimal comNum)
|
||||
=> Surgeries(comNum, mainDiagnosisOnly: false);
|
||||
|
||||
/// <summary>
|
||||
/// <paramref name="mainDiagnosisOnly"/> 가 true 면 상병 집계를 주상병(OPRVAR1='0')로
|
||||
/// 한정한다 — 레거시 <c>GetOprInfDT_OKDMain</c>(bzDataInterface.vb:13364)과
|
||||
/// <c>GetOprInfDT</c> 의 유일한 실질 차이가 이 조인 조건 한 줄이다
|
||||
/// (OKDMain 판의 수술부위·비고 컬럼 부재와 정렬 약화는 옮기지 않는다 —
|
||||
/// 그 판으로 부위 태그를 부르면 레거시도 컬럼 예외였다).
|
||||
/// </summary>
|
||||
public List<Dictionary<string, string>> Surgeries(decimal comNum, bool mainDiagnosisOnly)
|
||||
{
|
||||
using var connection = new OracleConnection(connectionString);
|
||||
connection.Open();
|
||||
using var command = connection.CreateCommand();
|
||||
command.BindByName = true;
|
||||
command.CommandText = Query;
|
||||
var sql = mainDiagnosisOnly
|
||||
? Query.Replace("AND OKDNAM.OprTyp = 'OKD'",
|
||||
"AND OKDNAM.OprTyp = 'OKD' AND OKDNAM.OPRVAR1 = '0'")
|
||||
: Query;
|
||||
if (mainDiagnosisOnly && !sql.Contains("OPRVAR1", StringComparison.Ordinal))
|
||||
{
|
||||
// 치환이 빗나가면 주상병 필터 없는 값이 조용히 나간다 — 빈 값보다 나쁘다
|
||||
throw new InvalidOperationException("주상병 필터 치환이 원문과 맞지 않습니다");
|
||||
}
|
||||
command.CommandText = sql;
|
||||
command.Parameters.Add(new OracleParameter("iComNum", comNum));
|
||||
|
||||
var rows = new List<Dictionary<string, string>>();
|
||||
|
||||
Reference in New Issue
Block a user