conflict 6건을 고치고 재료 재사용으로 10종을 더한다 — 30종 → 40종
## conflict 6건 (통합 계획의 "고칠 것")
값이 바뀌는 것 둘:
- ETC_현재년도 — "2026" → "2026년"(bzDataInterface.vb:16923 의 + "년").
형제 ETC_현재일시_1_년 은 접미가 없어 둘을 갈랐다(ClockFormat.YearSuffixed 신설).
"2026" 을 단정하던 테스트도 고쳤다.
- ETC_로그인_사용자ID_사용자명 — 레거시(:17930)는 빈 값 검사 없이 항상 결합한다.
한쪽이 비어도 "U01." 이 그대로 나간다. 조건을 붙였던 것이 레거시와 달랐다.
행 선택이 바뀌는 것 둘:
- ETC_로그인_사용자연락처 / 원내연락처 — 전에는 M_UidMst 를 조건 없이 첫 행.
이력이 여러 행인 사용자에서 옛 연락처가 나올 수 있었다.
유효기간(SYSDATE 일자 BETWEEN)으로 고르고, 0행이면 레거시 폴백(:10641)처럼
조건 없이 다시 찾는다.
의도적 차이로 기록한 것 둘(코드 주석):
- 유효기간 판정 일자 — 레거시는 로그인 시점, 여기는 SYSDATE(자정 넘긴 세션에서만 갈림).
- Trim — 레거시는 무가공, 여기는 걷는다(CHAR 잔여 공백이 종이에 찍히는 쪽이 더 이상하다).
## new 48종 중 재료 재사용으로 되는 10종
워크플로 매핑 상세(docs/new48-mappings.json)를 붙여 보니 46종이 needs-lookup 인데,
그중 10종은 <b>이미 든 행의 다른 컬럼</b>이거나 문맥 계산이었다:
- 담당의 행 재사용 3: OCM_담당의사_영문(UidEngNam) · 면허번호(UidLicNum) · 전문의번호(UidSpcLic)
— 조회 갈래가 OCM_담당의사와 문자 그대로 같고 집는 컬럼만 다르다(:4094·4119·4144)
- CowInf 재사용 3: OCM_병실베드(CowBedCod) · 병동_병실 · 병동_병실_베드(" / " 결합, 행 없으면 "")
- 문맥 계산 1: OCM_내원유형(입원/응급실/외래 — ComPatTyp·ComEmgYon)
- User 계열 3: OCM_User진료과 · _한글명칭 · User진료의사명.
로그인 사용자가 의사(UidDtrYon=Y)면 사용자의 과·이름, 아니면 환자의 것.
HisUser 에 DoctorYn·DepOfficialName 을 추가했다(세션 조회 SELECT 확장).
남은 new 는 새 조회가 필요한 세 무리다: 상병(Okd_상병쿼리) · 수술(GetOprInfDT) ·
심사(Bkd_상병쿼리). 다음 배치.
## 게이트
- dotnet test 338/338 (현재년도·ID.사용자명 판정 갱신)
- --edit-smoke 실패 0 (이름 검사 40종)
- --db-patient ①~㉔ 전건 통과
- --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e62e43d176
commit
9278b39a6d
@@ -72,21 +72,41 @@ public sealed class TagPreviewStore
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>연락처 두 칸 — 세션에 없는 것은 이것뿐이라 이 한 줄만 더 읽는다</summary>
|
||||
/// <summary>
|
||||
/// 연락처 두 칸 — 세션에 없는 것은 이것뿐이라 이 한 줄만 더 읽는다.
|
||||
///
|
||||
/// <b>유효기간으로 고른다.</b> 레거시(GetUidMst, clsCommonLib.vb:10636)는
|
||||
/// <c>:일자 BETWEEN UidStrDte AND UidEndDte</c> 로 행을 고르고,
|
||||
/// 0행이면 코드만으로 다시 찾는다(:10641 폴백). 전에는 조건 없이 첫 행을 집어서
|
||||
/// 이력이 여러 행인 사용자에서 <b>옛 연락처</b>가 나올 수 있었다.
|
||||
/// 판정 일자는 레거시가 로그인 시점(GetAdpDtm 앞 8자)인데 여기는 서버 오늘이다 —
|
||||
/// 자정을 넘겨 계속 켜 둔 세션에서만 갈리는 차이라 받아들이고 기록해 둔다.
|
||||
/// </summary>
|
||||
private static (string Mobile, string Office) ReadPhones(OracleConnection connection, string uidCod)
|
||||
{
|
||||
if (uidCod.Length == 0)
|
||||
{
|
||||
return (string.Empty, string.Empty);
|
||||
}
|
||||
var valid = ReadPhoneRow(connection,
|
||||
"SELECT UIDMBLPHN, UIDOFFTEL FROM M_UIDMST WHERE UIDCOD = :uid"
|
||||
+ " AND TO_CHAR(SYSDATE,'YYYYMMDD') BETWEEN UIDSTRDTE AND UIDENDDTE", uidCod);
|
||||
return valid ?? ReadPhoneRow(connection,
|
||||
"SELECT UIDMBLPHN, UIDOFFTEL FROM M_UIDMST WHERE UIDCOD = :uid", uidCod)
|
||||
?? (string.Empty, string.Empty);
|
||||
}
|
||||
|
||||
private static (string Mobile, string Office)? ReadPhoneRow(
|
||||
OracleConnection connection, string sql, string uidCod)
|
||||
{
|
||||
using var command = connection.CreateCommand();
|
||||
command.CommandText = "SELECT UIDMBLPHN, UIDOFFTEL FROM M_UIDMST WHERE UIDCOD = :uid";
|
||||
command.CommandText = sql;
|
||||
command.CommandTimeout = TimeoutSeconds;
|
||||
command.Parameters.Add(new OracleParameter("uid", uidCod));
|
||||
using var reader = command.ExecuteReader();
|
||||
if (!reader.Read())
|
||||
{
|
||||
return (string.Empty, string.Empty);
|
||||
return null;
|
||||
}
|
||||
return (reader.IsDBNull(0) ? string.Empty : reader.GetString(0),
|
||||
reader.IsDBNull(1) ? string.Empty : reader.GetString(1));
|
||||
|
||||
@@ -9,7 +9,11 @@ namespace SheetMe.Data.Stores;
|
||||
public sealed record HisUser(
|
||||
string UidCod, string UidNam,
|
||||
string DepCod, string DepNam,
|
||||
string HspCod, string HspNam)
|
||||
string HspCod, string HspNam,
|
||||
/// <summary>의사 여부(UidDtrYon=Y) — OCM_User진료과 계열이 로그인 사용자 분기에 쓴다</summary>
|
||||
string DoctorYn = "",
|
||||
/// <summary>부서 공식 명칭(DepOfcNam) — 개원일 조건이 걸리는 병원에서 한글명 대신 쓴다</summary>
|
||||
string DepOfficialName = "")
|
||||
{
|
||||
/// <summary>미인증 세션(인자 없이 단독 실행) — DB 쓰기가 차단된다</summary>
|
||||
public static readonly HisUser Unknown = new(string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty);
|
||||
@@ -58,10 +62,16 @@ public sealed class UserContextStore
|
||||
connection.Open();
|
||||
using var command = connection.CreateCommand();
|
||||
command.BindByName = true;
|
||||
// 레거시와 두 가지가 <b>의도적으로</b> 다르다(워크플로 검증이 짚었고, 받아들이기로 했다):
|
||||
// · 유효기간 판정 일자 — 레거시는 로그인 시점(GetAdpDtm 앞 8자, clsCommonLib.vb:10622),
|
||||
// 여기는 SYSDATE. 자정을 넘겨 계속 켜 둔 세션에서만 갈린다.
|
||||
// · Trim — 레거시는 UidCod/UidNam 을 무가공으로 쓰고(bzDataInterface.vb:16713, 16720)
|
||||
// 여기는 걷는다. CHAR 잔여 공백이 종이에 찍히는 쪽이 더 이상하다고 판단했다.
|
||||
command.CommandText =
|
||||
"SELECT u.UidCod, NVL(u.UidNam,' '), " +
|
||||
" NVL(u.UidDepCod,' '), NVL(d.DepKorNam,' '), " +
|
||||
" NVL(u.UidHspCod,' '), NVL(h.HspInsNam,' ') " +
|
||||
" NVL(u.UidHspCod,' '), NVL(h.HspInsNam,' '), " +
|
||||
" NVL(u.UidDtrYon,' '), NVL(d.DepOfcNam,' ') " +
|
||||
"FROM M_UidMst u " +
|
||||
"LEFT JOIN M_DepMst d ON d.DepCod = u.UidDepCod " +
|
||||
" AND TO_CHAR(SYSDATE,'YYYYMMDD') BETWEEN d.DepStrDte AND d.DepEndDte " +
|
||||
@@ -79,7 +89,8 @@ public sealed class UserContextStore
|
||||
return new HisUser(
|
||||
reader.GetString(0).Trim(), reader.GetString(1).Trim(),
|
||||
reader.GetString(2).Trim(), reader.GetString(3).Trim(),
|
||||
reader.GetString(4).Trim(), reader.GetString(5).Trim());
|
||||
reader.GetString(4).Trim(), reader.GetString(5).Trim(),
|
||||
reader.GetString(6).Trim(), reader.GetString(7).Trim());
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user