사용자 결정(②SMB 직접 접근)에 따라 구현. 실측 확인:
- 파일서버 = DB 서버와 같은 호스트, 전송 데몬 포트 2002 는 열림
- <b>SMB 445·139 는 닫힘</b>, UNC·관리공유 접근 모두 실패 → 서버측 조치 필요
- 서명 경로는 서버측 절대경로 D:\MsystechHIS\{사이트}\... (설정 루트 E:\msys\ 와 다름)
그래서 공유가 열리는 즉시 동작하도록 매핑을 넣었다:
Images:SignatureShareMap 에 "서버접두=UNC접두" 를 두면 해석 순서가
①레거시 캐시 ②공유(UNC) ③직접 경로가 된다. 접두는 대소문자 무시로
<b>긴 것부터</b> 맞추고(짧은 접두가 정확한 대응을 묻지 않게), '=' 없는
설정 오타는 무시한다(반쪽 경로를 만들면 조용히 틀린다). 자격증명은
설정에 담지 않는다 — 공유 접근은 단말 로그인 계정으로 붙는다.
진단 --db-filecfg 확장: 접속 <b>대상</b>(Type·IP·Port·FileDirectory)과
경로 접두 분포를 찍고(자격증명은 길이만), 공유 매핑별 접근 가능 여부와
파일서버 SMB(445) 개방 여부를 판정해 무엇을 열어야 하는지 알려 준다.
- dotnet test 358/358 (매핑 4건 추가: 치환·긴 접두 우선·오타 무시·해석 순서)
- --edit-smoke 실패 0 · --db-patient ①~㊲ 전건 통과
- --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 불변
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
68 lines
3.4 KiB
C#
68 lines
3.4 KiB
C#
namespace SheetMe.Data.Config;
|
|
|
|
/// <summary>
|
|
/// 데이터 계층 설정 — appsettings.json 바인딩 모델.
|
|
/// SaveMode 기본값은 File — 운영 레거시 테이블(E_SdgMst/E_SctMst) 쓰기는 명시적 설정 후에만 활성화된다.
|
|
/// </summary>
|
|
public sealed class DataConfig
|
|
{
|
|
#region Properties
|
|
/// <summary>Oracle 접속 문자열 — 어느 원천에서도 못 찾으면 빈 문자열(파일 전용 모드)</summary>
|
|
public string ConnectionString { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 접속 정보의 출처 — "appsettings" 또는 "ServerInfo(병원라벨)". 진단·상태 표시용이며
|
|
/// <b>자격증명은 담지 않는다</b>(어느 DB 에 붙었는지만 알려준다).
|
|
/// </summary>
|
|
public string ConnectionSource { get; set; } = "없음";
|
|
|
|
/// <summary>캔버스 그리드 간격(px)</summary>
|
|
public int GridSize { get; set; } = 4;
|
|
|
|
/// <summary>정렬 가이드 스냅 임계값(px)</summary>
|
|
public int SnapThreshold { get; set; } = 6;
|
|
|
|
/// <summary>저장 모드 — File(기본, .xml 파일) | Db(E_SdgMst/E_SctMst 저장)</summary>
|
|
public string SaveMode { get; set; } = "File";
|
|
|
|
/// <summary>파일 모드 서식 폴더</summary>
|
|
public string XmlFolder { get; set; } = "forms";
|
|
|
|
/// <summary>
|
|
/// 같은 서식을 여러 탭으로 여는 것을 허용할지 — 기본 false(레거시 AllowMultiSheetForm 기본 "N" 과 동일).
|
|
///
|
|
/// 막는 이유는 불편이 아니라 데이터 손실이다. 두 탭에서 교대로 저장하면 낙관적 충돌 검출이
|
|
/// 어느 쪽에도 없어 마지막 저장이 앞선 편집을 통째로 덮는다.
|
|
/// 비교용으로 나란히 열어야 하는 경우가 있어 탈출구는 남겨 둔다.
|
|
/// </summary>
|
|
public bool AllowMultiSheetForm { get; set; }
|
|
|
|
/// <summary>
|
|
/// 개발용 HIS 사용자 코드 — 기동 인자 없이 실행할 때만 시도하는 폴백.
|
|
/// 운영 배포본의 appsettings.json 에는 이 키가 없으므로 자동으로 비활성이다.
|
|
/// 여기 담는 것은 설정값(UidCod 문자열)뿐이며, 해석된 사용자 정보는 담지 않는다.
|
|
/// </summary>
|
|
public string DevUidCod { get; set; } = string.Empty;
|
|
|
|
/// <summary>
|
|
/// 싸인·직인 이미지의 <b>서버 경로 → UNC 공유</b> 대응 — <c>"서버접두=UNC접두"</c> 목록.
|
|
/// 예: <c>D:\MsystechHIS=\\192.168.100.222\MsystechHIS</c>
|
|
///
|
|
/// <b>왜 설정인가.</b> DB 는 이미지 위치를 파일서버의 <b>로컬 절대경로</b>로 들고 있고
|
|
/// (실측: <c>D:\MsystechHIS\{사이트}\…</c>), 레거시는 그 경로를 ActiveX OCX 데몬
|
|
/// (기본 포트 2002)에 넘겨 받아 온다. 그 프로토콜은 재현할 수 없으므로 우리는 같은 파일을
|
|
/// <b>공유 폴더로 직접</b> 읽는다 — 접두 대응은 병원마다 다르니 코드가 아니라 설정이다.
|
|
///
|
|
/// 비어 있으면(기본) 매핑을 시도하지 않는다 — 지금까지와 같이 로컬 캐시만 본다.
|
|
/// <b>자격증명은 담지 않는다</b>: 공유 접근 권한은 단말 로그인 계정으로 해결한다.
|
|
/// </summary>
|
|
public string[] SignatureShareMap { get; set; } = Array.Empty<string>();
|
|
#endregion
|
|
|
|
#region Methods
|
|
/// <summary>DB 저장 모드 여부</summary>
|
|
public bool IsDbSaveMode()
|
|
=> string.Equals(SaveMode, "Db", StringComparison.OrdinalIgnoreCase);
|
|
#endregion
|
|
}
|